package com.atguigu.gulimall.order.service.impl;

import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.Query;
import com.atguigu.gulimall.order.dao.OrderItemDao;
import com.atguigu.gulimall.order.entity.OrderEntity;
import com.atguigu.gulimall.order.entity.OrderItemEntity;
import com.atguigu.gulimall.order.entity.OrderReturnReasonEntity;
import com.atguigu.gulimall.order.service.OrderItemService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;

/**
 * @author : wenchao.long
 * @date : Created in 2021/8/18 8:56 周三
 * @description :
 */
@Service("orderItemService")
@RabbitListener(queues = {"hello-java-queue"})
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderItemEntity> page = this.page(
                new Query<OrderItemEntity>().getPage(params),
                new QueryWrapper<>()
        );

        return new PageUtils(page);
    }

    /**
     * queue: 声明需要监听的所有队列
     * org.springframework.amqp.core
     * <p>
     * 参数可以写一下类型
     * 1. Message message 原生消息详细内容 消息头+体
     * 2. Message message, T entity <发送的消息的类型> 可以直接映射上
     * 3. Channel channel 当前传输数据的通道
     * <p>
     * Queue: 可以很多人都来监听 只要收到消息，队列删除消息 而且只能有一个人收到此消息
     * 1). 订单服务启动多个：同一个消息，只能有一个客户端收到
     * 2). 只有一个消息完全处理完 方法运行结束 我们就可以接收到下一个消息
     * <p>
     */

    // @RabbitListener 类加+方法上
    // @RabbitHandler() 标注在方法上(重载区分不同的消息)
    @RabbitHandler()
    public void receiveMessage(Message message, OrderReturnReasonEntity entity,
                               Channel channel) {
        System.out.println("接收到消息...===>内容" + entity);
        System.out.println("消息处理完成==>" + entity.getName());
        // channel内按顺序自增
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        System.out.println(deliveryTag);

        // 签收货物 非批量模式
        try {
            channel.basicAck(deliveryTag, false);
            System.out.println("签收了货物");
        } catch (IOException e) {
            // 网络中断
        }
    }

    @RabbitHandler()
    public void receiveMessage(Message message, OrderEntity entity,
                               Channel channel) {
        System.out.println("接收到消息...===>内容" + entity);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            if (deliveryTag % 2 == 0) {
                channel.basicAck(deliveryTag, false);
                System.out.println("签收货物");
            } else {
                // 退货
                // requeue false丢弃 true返回服务器
                channel.basicNack(deliveryTag, false, true);
                System.out.println("拒收货物");
            }
        } catch (IOException e) {
            // 网络中断
        }
    }

}
